ติดตั้ง knockd ใช้ร่วมกับ UFW เพื่อซ่อน sshd บน ubuntu 16.04
บันทึกนี้ปรับปรุงล่าสุดเมื่อวันที่ 19-06-60
ดูแลโดย วิบูลย์
บทความนี้ใช้สำหรับ server ที่เปิดใช้งาน UFW แล้ว และโดยค่า default ของ UFW จะ deny ทุกอย่าง ดังนั้นเรามักจะเปิด Port 22/tcp ไว้เพื่อ ssh เข้าไปทำงานได้อยู่ก่อนแล้ว
ต้องอ่านเรื่อง การใช้งาน UFW เพื่อทำเป็น host firewall บน ubuntu 16.04 และเข้าใจแล้ว
1. ติดตั้ง knockd
sudo apt install knockd
เริ่มต้นใช้ UFW ปิด port 22 ก่อนเลย
sudo ufw insert 1 deny from any to any port 22
หลังจากคำสั่งนี้ เราจะไม่สามารถ ssh เข้าไปที่ server ได้แล้วนะ ทดสอบดูได้จาก client
และหากจะยกเลิกไม่ใช้งาน knockd ซ่อน sshd แล้ว ให้ทำดังนี้
sudo ufw delete deny from any to any port 22
จำเป็นอย่างมากในขั้นตอนนี้ ให้เลือกเลข port ที่จะใช้มาสัก 3 เลข เช่น 7001,8002,9003 เป็นต้น แล้วเปิดอนุญาต port ไว้ด้วย
sudo ufw allow 7001 sudo ufw allow 8002 sudo ufw allow 9003
2. แก้ไขไฟล์ /etc/knockd.conf
จากเดิม
[options] UseSylog [openSSH] sequence = 7000,8000,9000 seq_timeout = 5 command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 9000,8000,7000 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
ให้เป็น
[options] LogFile = /var/log/portknocking.log [openSSH] sequence = 7001,8002,9003 seq_timeout = 5 command = ufw insert 1 allow from %IP% to any port 22 tcpflags = syn [closeSSH] sequence = 9003,8002,7001 seq_timeout = 5 command = ufw delete allow from %IP% to any port 22 tcpflags = syn
3. เปิดใช้งาน knockd
โดยแก้ไขไฟล์ /etc/default/knockd เพื่อกำหนดว่าจะใช้งานกับ network interface ใด ตัวอย่างคือ enp0s3
sudo vi /etc/default/knockd
ตั้งค่าดังนี้
START_KNOCKD=1 KNOCKD_OPTS="-i enp0s3"
แล้วทำคำสั่งนี้
sudo systemctl restart knockd.service
ตรวจสอบว่า knockd ทำงานสำเร็จ โดยใช้คำสั่งเพื่อเปิดดูส่วนท้ายของ Log file ต่อเนื่อง
mama@s2:~$ sudo tail -f /var/log/portknocking.log [2017-06-19 11:08] starting up, listening on enp0s3
รอดูว่าจะมีการใช้ Port knocking เข้ามาหรือไม่
4. ทดสอบจากเครื่อง client ที่มี knockd ติดตั้งไว้
4.1 ติดตั้ง knockd (ถ้ายังไม่มี)
sudo apt update sudo apt install knockd
4.2 รันคำสั่งทดสอบ ขอเปิด sshd
knock 10.0.2.4 7001 8002 9003
ผลลัพธ์ที่ฝั่ง server sshd
[2017-06-19 11:09] 10.0.2.5: openSSH: Stage 1 [2017-06-19 11:09] 10.0.2.5: openSSH: Stage 2 [2017-06-19 11:09] 10.0.2.5: openSSH: Stage 3 [2017-06-19 11:09] 10.0.2.5: openSSH: OPEN SESAME [2017-06-19 11:09] openSSH: running command: ufw insert 1 allow from 10.0.2.5 to any port 22
ผลลัพธ์ที่ฝั่ง client หลังคำสั่ง knock จะ ssh เข้าได้
linuxlite@linuxlite-VirtualBox:~$ knock 10.0.2.4 7001 8002 9003 linuxlite@linuxlite-VirtualBox:~$ ssh mama@s2.natnetwork mama@s2.natnetwork's password:
4.3 รันคำสั่งทดสอบ ขอปิด sshd
knock 10.0.2.4 9003 8002 7001
ผลลัพธ์ที่ฝั่ง server sshd
[2017-06-19 11:11] 10.0.2.5: closeSSH: Stage 1 [2017-06-19 11:11] 10.0.2.5: closeSSH: Stage 2 [2017-06-19 11:11] 10.0.2.5: closeSSH: Stage 3 [2017-06-19 11:11] 10.0.2.5: closeSSH: OPEN SESAME [2017-06-19 11:11] closeSSH: running command: ufw delete allow from 10.0.2.5 to any port 22
ผลลัพธ์ที่ฝั่ง client หลังคำสั่ง knock จะ ssh เข้าไม่ได้ ต้องกด Ctrl + C ยกเลิก
linuxlite@linuxlite-VirtualBox:~$ knock 10.0.2.4 9003 8002 7001 linuxlite@linuxlite-VirtualBox:~$ ssh mama@s2.natnetwork ^C linuxlite@linuxlite-VirtualBox:~$
หมายเหตุ ขอแนะนำ knockd อีก 1 วิธี (มีอีกหลายวิธี) แบบเปิด แล้ว ปิด ตามจำนวนวินาทีในตัวแปร cmd_timeout จึงต้องเขียน config อีกแบบ
[options] LogFile = /var/log/portknocking.log [opencloseSSH] sequence = 7001,8002,9003 seq_timeout = 5 tcpflags = syn start_command = ufw insert 1 allow from %IP% to any port 22 cmd_timeout = 10 stop_command = ufw delete allow from %IP% to any port 22
ทุกครั้งที่แก้ไข config file /etc/knockd.conf ให้ทำคำสั่งนี้ด้วย
sudo systemctl restart knockd.service
Reference:
https://joost.vunderink.net/blog/2015/05/07/hiding-your-sshd-with-ufw-and-knockd-on-ubuntu/